package com.coszero.utils.file

import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.documentfile.provider.DocumentFile
import java.io.BufferedWriter
import java.io.File
import java.io.FileOutputStream
import java.io.FileWriter
import java.io.IOException

/**
 * Desc:文件创建工具类
 *
 * @author coszero
 * Email:xmqian93@163.com
 * Date:2021/11/02 11:30
 */
object FileCreateUtils {
    /**
     * 写入字符传到指定文件
     * - 相同的文件名会被重复写入数据,不会覆盖原有数据会直接将数据拼接在后面
     *
     * @param dirPath 写入的文件夹路径 FileDirPathUtils.createAppExternalFilesDir(mActivity, "")
     * @param fname 文件名称,带后缀
     * @param wstr 需要写入的字符串
     */
    @Synchronized
    fun writeStrToFile(dirPath: String?, fname: String, wstr: String?) {
        try {
            val file = File(dirPath, fname)
            val bufferedWriter = BufferedWriter(FileWriter(file, true))
            bufferedWriter.write(wstr)
            bufferedWriter.close()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    /**
     * 写入字节数组到指定文件
     *
     * @param dirPath 文件夹路径
     * @param fileName 文件路径
     * @param audioData 字节数组
     */
    @Synchronized
    fun writeByteArrayToFile(dirPath: String, fileName: String, audioData: ByteArray?): String? {
        try {
            val directory = File(dirPath)
            // 检查目录是否存在
            if (!directory.exists()) {
                // 不存在时创建多级目录（包含父目录）
                val dirsCreated = directory.mkdirs()
                if (!dirsCreated) {
                    throw IOException("Failed to create directory: $dirPath")
                }
            }
            // 创建文件对象
            val audioFile = File(directory, fileName)
            FileOutputStream(audioFile).use { fos ->
                fos.write(audioData)
                fos.flush()
                return audioFile.absolutePath
            }
        } catch (e: IOException) {
            e.printStackTrace()
            // 可添加更详细的异常处理
        }
        return null
    }

    /**
     * 使用  Storage Access Framework 模式存储文件
     * 此方法仅适用于 Android 10 及以上版本
     * 用户手动选择要存储文件的目录
     *
     * @param context
     * @param dirUri
     * @param fileName 文件名带后缀
     * @param content //开启文件选择器
     * Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
     * startActivityForResult(intent, REQUEST_CODE_OPEN_DIRECTORY);
     */
    @Synchronized
    fun writeStrToFile(context: Context, dirUri: Uri, fileName: String, content: String) {
        context.contentResolver.takePersistableUriPermission(
            dirUri,
            Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
        )
        // 使用 DocumentFile API 创建文件
        val pickedDir = DocumentFile.fromTreeUri(context, dirUri)
        val newFile = pickedDir!!.createFile("text/plain", fileName)

        // 写入内容
        try {
            checkNotNull(newFile)
            val os = checkNotNull(context.contentResolver.openOutputStream(newFile.uri))
            os.write(content.toByteArray())
            os.close()
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}
